<?php
declare (strict_types=1);

namespace addons\WeChatMini\driver;

use addons\WeChatMini\Exception\WeChatMiniException;
use WeMini\Crypt;

class WeChatMini
{

    /**
     * @var mixed 微信配置参数
     */
    protected $config;

    public function __construct()
    {
        $this->config = config('pay')['wechat'];
    }

    /**
     * @param $code
     * @return array
     * @throws WeChatMiniException
     * 原点 2022年12月8日15:17:22 通过code获取openid，session_key
     */
    public function session($code)
    {
        try {
            return (new Crypt($this->config))->session($code);
        } catch (\Exception $e) {
            throw new WeChatMiniException('获取失败：' . $e->getMessage(), -1);
        }
    }

    /**
     * @param $code
     * @param $iv
     * @param $encryptedData
     * @return array
     * @throws WeChatMiniException
     * 原点 2022年12月8日14:40:37 小程序授权登录，获取用户信息
     */
    public function getUserInfo($code, $iv, $encryptedData): array
    {
        try {
            return (new Crypt($this->config))->userInfo($code, $iv, $encryptedData);
        } catch (\Exception $e) {
            throw new WeChatMiniException('获取失败：' . $e->getMessage(), -1);
        }
    }

    /**
     * @param $code
     * @return array
     * @throws WeChatMiniException
     * 原点 2022年12月8日15:17:22 通过code换取手机号
     */
    public function getPhoneNumber($code)
    {
        try {
            return (new Crypt($this->config))->getPhoneNumber($code);
        } catch (\Exception $e) {
            throw new WeChatMiniException('获取失败：' . $e->getMessage(), -1);
        }
    }

    /**
     * @param $userCode - 会员编号或者唯一标识
     * @param $page - 小程序码跳转的页面，默认pages/index/index
     * @param $savePath - 小程序码存放路径，默认./weChatMiniQrcode
     * @return string
     * @throws WeChatMiniException
     * 原点 2022年12月8日15:21:06 生成小程序码，
     */
    public function getMiniScene($userCode, $page = 'pages/index/index', $savePath = '/weChatMiniQrcode', $version = 'trial')
    {
        try {
            $url = '.' . $savePath . '/' . $userCode . '.png';
            if (!file_exists($url)) {
                $qrcode = (new Optimize($this->config))->getMiniScenes($userCode, $page, $version);
                file_put_contents($url, $qrcode);
            }
            return $savePath . $userCode . '.png';
        } catch (\Exception $e) {
            throw new WeChatMiniException('获取失败：' . $e->getMessage(), -1);
        }
    }

    /**
     * @param $iv - 小程序传的iv
     * @param $sessionKey - 小程序传的sessionKey或者自行保存的
     * @param $encryptedData - 小程序传的encryptedData
     * @return array|bool
     * @throws WeChatMiniException
     * 原点 2022年12月8日15:24:12 解密用户数据
     */
    public function decode($iv, $sessionKey, $encryptedData)
    {
        try {
            return (new Crypt(config('pay')['wechat']))->decode($iv, $sessionKey, $encryptedData);
        } catch (\Exception $e) {
            throw new WeChatMiniException('解析失败：' . $e->getMessage(), -1);
        }
    }


}